﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace fApp
{
    /// <summary>
    /// アプリケーションの最低限の要素を定義しています。
    /// </summary>
    public interface ebApp
    {
        /// <summary>
        ///　ここにアプリケーション名を指定します。
        /// </summary>
        string Name
        {
            get;
        }

        /// <summary>
        /// ここにShowDialog()するべきフォームかを指定します。
        /// </summary>
        bool showDialog
        {
            get;
        }

        /// <summary>
        /// 実行メソッドです。fAppシステムは、この関数をコールします。
        /// </summary>
        void Run();

        /// <summary>
        /// アプリケーションの終了処理を記述してください。
        /// </summary>
        void Dispose();
        
    }

    /// <summary>
    /// fAppシステムのinterfaceです。
    /// </summary>
    public interface fAppIntarface
    {
        /// <summary>
        /// Invoke()することができます。
        /// </summary>
        /// <param name="func">実行する関数。</param>
        void invoke(Delegate func);
        /// <summary>
        /// システムフォームの位置情報です。
        /// </summary>
        System.Drawing.Point Location{get;set;}
        /// <summary>
        /// アプリケーションの終了処理です。
        /// </summary>
        /// <param name="eap">終了するアプリケーション名。</param>
        void endApp(string eap);
    }

    namespace ebAPI
    {
        /// <summary>
        /// fAppシステムとの連携用のクラスです。
        /// </summary>
        static public class joinParent
        {
            /// <summary>
            /// fAppシステム用の変数です。
            /// </summary>
            static public fAppIntarface joinConnector = null;
            static public List<AppData> applist = null;
        }

        /// <summary>
        /// fAppシステム側が操作するためのAPIです。
        /// </summary>
        static public class eSystemCtrl
        {
            static public void setJoin(fAppIntarface ei)
            {
                joinParent.joinConnector = ei;
            }
        }

        /// <summary>
        /// fAppAPP用のクラスです。アプリのコントロールはここから行えます。
        /// </summary>
        static public class eCtrlApp
        {
            /// <summary>
            /// フォームの表示管理に利用します。
            /// </summary>
            static private List<fForm> itForm = new List<fForm>();

            /// <summary>
            /// 各アプリケーションのフォームを表示します。
            /// </summary>
            /// <param name="form">表示するeFormを継承したフォーム。</param>
            /// <param name="pp">アプリケーションのインスタンス。</param>
            /// <returns>実行して返ってきたDialogResultを返します。</returns>
            static public System.Windows.Forms.DialogResult Show(fForm form, ebApp pp)
            {
                itForm.Add(form);
                return form.ShowApp(pp.showDialog);
            }
            /// <summary>
            /// アプリケーションの終了を通知するための関数です。
            /// 使用されたリソースを開放します。
            /// </summary>
            /// <param name="eap">定義したアプリケーション名。</param>
            static public void endApplication(string eap)
            {
                joinParent.joinConnector.endApp(eap);
            }

            /// <summary>
            /// 起動しているアプリのフォームを全てアクティブにします。
            /// </summary>
            static public void showAll()
            {
                foreach (fForm ef in itForm)
                {
                    //アクティブにする
                    ef.Activate();
                }
            }
        }

        /// <summary>
        /// インストールされているアプリケーションの情報を提供します。
        /// </summary>
        static public class appInfo
        {
            /// <summary>
            /// アプリケーションの情報を取得します。
            /// </summary>
            /// <param name="appName">取得したいアプリケーションの名前。</param>
            /// <returns>存在すればそのデータ、しなければnullを返します。</returns>
            public static AppData getApp(string appName)
            {
                AppData result = null;
                return result;
            }
            /// <summary>
            /// アプリケーションのリストを取得します。
            /// これは、joinParent.applistのデータを取得するのと同じ効果です。
            /// </summary>
            /// <returns>リストを返します。</returns>
            public static List<AppData> getAppList()
            {
                return joinParent.applist;
            }
            
        }
    }

    /// <summary>
    /// アプリケーションの情報を提供します。
    /// </summary>
    public class AppData
    {
        /// <summary>
        /// インストールされているバージョン。
        /// </summary>
        public string version = "";
        /// <summary>
        /// このアプリの公開者。
        /// </summary>
        public string publisher = "";
        /// <summary>
        /// このアプリの名前。
        /// </summary>
        public string name = "";
        /// <summary>
        /// このアプリの公開日。
        /// </summary>
        public string date = "";
        /// <summary>
        /// このアプリについての説明。
        /// </summary>
        public string detail = "";
        /// <summary>
        /// 公開者のWebサイト。
        /// </summary>
        public string pubURL = "";
    }
}
